package com.qf.service;

import com.qf.dao.CartDao;
import com.qf.dao.CartDaoImpl;
import com.qf.dao.GoodsDao;
import com.qf.dao.GoodsDaoImpl;
import com.qf.pojo.Cart;
import com.qf.pojo.Goods;
import netscape.security.UserTarget;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * @author 86199
 * @version V1.0
 * @Project jqueryDemo
 * @Package com.qf.service
 * @Description:
 * @Date 2022/5/25 20:54
 */
public class CartServiceImpl implements CartService {
    @Override
    public boolean createCart(Integer uid, Integer pid) {
        //1. 根据用户id和商品id，到数据库中查询是否已经有这个商品的数据
        CartDao  cartDao = new CartDaoImpl();
        Cart cart = cartDao.findCartByUidAndPid(uid,pid);

        //2. 根据商品id，查询商品对象
        GoodsDao goodsDao = new GoodsDaoImpl();
        Goods goods = goodsDao.findById(pid);

        if (cart != null){
            //2. 判断如果能够查询到这个购物项数据，进行购买数量的添加
            // 购买件数+1
            cart.setNum(cart.getNum()+1);
            //将商品的对象放入购物车中
            cart.setGoods(goods);
            //重新计算总价钱=商品的购买数量 * 商品单价
            cart.setMoney(cart.getNum() * goods.getPrice());
            //调用dao，将最新的购物车数据更新到表中
            cartDao.updateCart(cart);
        }else{
            //3.判断如佛查不到这个购物项的数据，那么作为新的购物车添加到数据库中
            //因为cart购物车为null，所以需要new创建购物车对象
            cart = new Cart();

            //用户id
            cart.setUid(uid);
            //商品id
            cart.setPid(pid);
            //购买数量
            cart.setNum(1);
            //将商品对象的放入购物车中
            cart.setGoods(goods);
            //总价 = 购买数量 * 商品单价
            cart.setMoney(cart.getNum() * goods.getPrice());

            cartDao.insertCart(cart);

        }
        return true;
    }

    @Override
    public List<Cart> findCartListByUid(int id) {
        //根据用户id，查询购物项集合
        CartDao cartDao = new CartDaoImpl();
        List<Cart>cartList = cartDao.findCartListByUid(id);
        //查询所有商品数据
        GoodsDao goodsDao = new GoodsDaoImpl();
        List<Goods>goodList =  goodsDao.findGoodsAll();




        /**
         *
         * 这种做法效率慢，因为遍历的次数是cartlist集合的个数 乘以 goodsList几个的个数
         *     if(cartList !=null){
         *         遍历购物车集合
         *         for(Cart cart :cartList){
         *              遍历所有商品集合
         *              for(Goods goods :goodList){
         *                  if(cart.getPid() == goods.getId()){
         *                      //将商品对象，放入购物车中
         *                      cart.setGoods(goods);
         *
         *                  }
         *              }
         *     }
         *
         *
         *}
         *
         *
         *
         *
         * 优化方案，优化代码的执行效率，遍历次数 = cartList 集合中的个数 + goodsLIst 集合中的个数
         *1.将数据量多的集合，放入Map《String，Goods》中
         * 2.遍历另一个集合，在遍历的过程中，直接从map中get数据
         * 时间空间复杂度
         * 时间：程序的执行速度快慢可以用时间来表示，执行中的时间越少，说明执行效率越高，代码的优秀程度越高
         * 空间：程序的存储需要占用磁盘获得内存空间，当然占用的越少越好
         * List 时间复杂度 S=0（n）代表list中获取数据，n代表list 中元素的个数，元素越多获取效率越慢
         * Map 时间复杂度 S = 0（1）代表了map中去数据，1代表map不管有多少元素个数，只需要一次就可以获取到
         *
         *
         */
        Map<String,Goods> goodsMap = new HashMap<String, Goods>();
        if (goodList != null){

            for (Goods goods :goodList){
                goodsMap.put(String.valueOf(goods.getId()),goods);

            }
        }
        if (cartList != null ){
            for (Cart cart : cartList){
                Goods goods = goodsMap.get(String.valueOf(cart.getPid()));
                if (goods != null){
                    //如果商品对象不为空，那么放入购物车对象中
                    cart.setGoods(goods);

                }

            }


        }

        return cartList;
    }

    @Override
    public void updateCart(Integer cid, Integer num) {
        //1.根据cid，到数据库查询这个购物项的数据
        CartDao cartDao = new CartDaoImpl();
        Cart cart = cartDao.findById(cid);
        //2. 根据查询到的购物项的 商品id， 到页面表中查询对应的商品数据
        GoodsDao goodsDao = new GoodsDaoImpl();
        Goods goods = goodsDao.findById(cart.getCid());
        //3. 重新计算总价 = 商品单价 * 商品购买数量
        cart.setNum(num);
        cart.setGoods(goods);
        cart.setMoney(goods.getPrice()*num);
        cartDao.updateCart(cart);
    }

    @Override
    public void deleteById(Integer id) {
        CartDao cartDao = new CartDaoImpl();
        cartDao.deleteById(id);

    }
}
